import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import ar.fi.uba.celdas.interfaces.ambiente.IAccion;
import ar.fi.uba.celdas.interfaces.ambiente.IInfoRobot;
import ar.fi.uba.celdas.interfaces.bc.IBaseConocimientos;
import ar.fi.uba.celdas.interfaces.bc.Regla;
import ar.fi.uba.celdas.interfaces.bc.Sensor;
import ar.fi.uba.celdas.interfaces.planificacion.IPlanificacion;
import ar.fi.uba.celdas.interfaces.ponderador.IPonderador;

public class BaseConocimientosMock implements IBaseConocimientos {

	static final String SENSOR_NORTE = "NORTE";
	static final String SENSOR_SUR = "SUR";
	static final String SENSOR_ESTE = "ESTE";
	static final String SENSOR_OESTE = "OESTE";

	private List<Regla> reglas = new ArrayList<Regla>();
	private Collection<Sensor> estadoAnterior = new ArrayList<Sensor>();
	private Collection<Sensor> estadoActual = new ArrayList<Sensor>();
	private Regla retraccion;

	public BaseConocimientosMock() {

	}

	protected static BaseConocimientosMock getBaseRetraccion() {
		BaseConocimientosMock bc = new BaseConocimientosMock();
		Collection<Sensor> condiciones = new ArrayList<Sensor>();
		Collection<Sensor> predicciones = new ArrayList<Sensor>();

		Sensor sNorte = new Sensor(SENSOR_NORTE, 4);
		Sensor sEste = new Sensor(SENSOR_ESTE, 2);
		Sensor sOeste = new Sensor(SENSOR_OESTE, 0);
		Sensor sSur = new Sensor(SENSOR_SUR, 2);

		condiciones.add(sNorte);
		condiciones.add(sEste);
		condiciones.add(sSur);

		predicciones.add(sNorte);
		predicciones.add(sEste);
		predicciones.add(sSur);

		Regla regla = new Regla();
		regla.getCondiciones().addAll(condiciones);
		regla.getPredicciones().addAll(predicciones);
		bc.retraccion = regla;
		bc.retraccion.setUso(10);
		bc.retraccion.setExitos(6);
		bc.reglas.add(bc.retraccion);

		bc.estadoAnterior.add(sNorte);
		bc.estadoAnterior.add(sEste);
		bc.estadoAnterior.add(sSur);

		bc.estadoActual.add(sNorte);
		bc.estadoActual.add(sOeste);
		bc.estadoActual.add(sSur);

		return bc;
	}

	protected static BaseConocimientosMock getBaseRetraccion_2() {
		BaseConocimientosMock bc = new BaseConocimientosMock();
		Collection<Sensor> condiciones = new ArrayList<Sensor>();
		Collection<Sensor> predicciones = new ArrayList<Sensor>();

		Sensor sNorte = new Sensor(SENSOR_NORTE, 4);
		Sensor sEste = new Sensor(SENSOR_ESTE, 2);
		Sensor sOeste = new Sensor(SENSOR_OESTE, 0);
		Sensor sSur = new Sensor(SENSOR_SUR, 2);

		condiciones.add(sNorte);
		condiciones.add(sEste);
		condiciones.add(sSur);

		predicciones.add(sNorte);
		predicciones.add(sEste);
		predicciones.add(sSur);

		Regla regla = new Regla();
		regla.getCondiciones().addAll(condiciones);
		regla.getPredicciones().addAll(predicciones);
		bc.retraccion = regla;
		bc.retraccion.setUso(10);
		bc.retraccion.setExitos(6);
		bc.reglas.add(bc.retraccion);

		bc.estadoAnterior.add(sNorte);
		bc.estadoAnterior.add(sEste);
		bc.estadoAnterior.add(sSur);

		bc.estadoActual.add(sNorte);
		bc.estadoActual.add(sOeste);

		return bc;
	}

	@Override
	public List<Regla> getReglas() {
		return null;
	}

	@Override
	public Collection<Sensor> getObjetivo() {
		return null;
	}

	@Override
	public Collection<Sensor> getEstadoAnterior() {
		return estadoAnterior;
	}

	@Override
	public Collection<Sensor> getEstadoActual() {
		return estadoActual;
	}

	@Override
	public Collection<IAccion> getAccionesDisponibles() {
		return null;
	}

	@Override
	public List<IAccion> procesarSiguientesAcciones(IInfoRobot infoRobot) {
		return null;
	}

	@Override
	public int getMaxValor(Sensor sensor) {
		return 0;
	}

	@Override
	public int getMinValor(Sensor sensor) {
		return 0;
	}

	@Override
	public Collection<Sensor> getEstadosConocidos() {
		return null;
	}

	@Override
	public void setPlanificador(IPlanificacion planificador) {
	}

	@Override
	public void setPonderador(IPonderador ponderador) {
	}

	public String toString() {
		String bc;

		bc = "BASE DE CONOCIMIENTOS\n";
		bc += "---- -- -------------\n\n";

		bc += "\nESTADO ANTERIOR:\n";
		for (Sensor sensor : estadoAnterior) {
			bc += sensor + "; ";
		}

		bc += "\nESTADO ACTUAL:\n";
		for (Sensor sensor : estadoActual) {
			bc += sensor + "; ";
		}

		bc += "\nREGLAS:\n";
		int i = 0;
		for (Regla regla : reglas) {
			bc += "Regla " + i++ + "\n";
			bc += regla + "\n";
		}

		return bc;
	}

	public void addRegla(Regla regla) {
		this.reglas.add(regla);
	}

	public Regla getReglaRetraccion() {
		return retraccion;
	}
}